﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using PlanoAula.BD;
using PlanoAula.Repository;

namespace PlanoAula
{
    public partial class ConteudoPlanoAulaForm : FormEdicao
    {

        IDiaAulaRepository repositoryDiaAula;
        IPlanoAulaCabRepository repository;
        IPlanoAulaDetalheRepository repositoryDetalhe;
        IDiaNaoUtilRepository repositoryDiaNaoUtil;
        IPlanoAulaDetalheRepository repositoryPlanoAulaDetalhe;
        public ConteudoPlanoAulaForm(PlanoAulaCab pac)
            : this(pac, new PlanoAulaCabRepository(), new PlanoAulaDetalheRepository(), new DiaNaoUtilRepository(), new DiaAulaRepository(), new PlanoAulaDetalheRepository())
        {
            
        }
        public ConteudoPlanoAulaForm(PlanoAulaCab pac, IPlanoAulaCabRepository repository, IPlanoAulaDetalheRepository repositoryDetalhe, IDiaNaoUtilRepository repositoryDiaNaoUtil, IDiaAulaRepository repositoryDiaAula, IPlanoAulaDetalheRepository repositoryPlanoAulaDetalhe)
            : base(pac.Id)
        {
            this.repositoryPlanoAulaDetalhe = repositoryDetalhe;
            this.repositoryDiaAula = repositoryDiaAula;
            this.repository = repository;
            this.repositoryDetalhe = repositoryDetalhe;
            this.repositoryDiaNaoUtil = repositoryDiaNaoUtil;
            InitializeComponent();
        }

        private void toolStripButtonGerarDadosIniciais_Click(object sender, EventArgs e)
        {
            repository.GerarDadosIniciais(this.IdItem);
            AtualizarDados();
        }

        private void ConteudoPlanoAulaForm_Load(object sender, EventArgs e)
        {
            AtualizarDados();
        }
        private void AtualizarDados()
        {
            planoAulaDetalheBindingSource.DataSource = repositoryDetalhe.ObterDetalhesDoPlanoAula(this.IdItem);
        }
        private void toolStripButtonAtulizar_Click(object sender, EventArgs e)
        {
            AtualizarDados();
        }

        private void btnAtualizar_Click(object sender, EventArgs e)
        {
            if (cbxConfirmarAcao.Checked || MessageBox.Show("Confirma a atualização do item selecionado?", "Atualização", MessageBoxButtons.OKCancel) == DialogResult.OK)
            {

                var planoAulaCab = repository.GetByKey(this.IdItem);
                if (planoAulaDetalheBindingSource.Current == null)
                {
                    btnAdicionarData_Click(sender, e);
                }
                var id = planoAulaDetalheBindingSource.Current.ConvertTo<PlanoAulaDetalhe>().Id;
                var planoAulaDetalhe = repositoryDetalhe.GetByKey(id);

                planoAulaDetalhe.Data = edtData.Value;
                planoAulaDetalhe.Conteudo = edtConteudoProgramatico.Text;
                planoAulaDetalhe.Referencia = edtReferencia.Text;
#warning rever
                /*
                    planoAulaDetalhe.HoraFinal = dtpAte.Value.Hour;
                    planoAulaDetalhe.HoraInicio = dtpDe.Value.Hour;
                    planoAulaDetalhe.MinutoInicio = dtpDe.Value.Minute;
                    planoAulaDetalhe.MinutoFinal = dtpAte.Value.Minute;
*/
                repositoryDetalhe.Save(planoAulaDetalhe);
            }
            AtualizarDados();
            if (planoAulaDetalheBindingSource.Position < planoAulaDetalheBindingSource.Count - 1)
            {
                planoAulaDetalheBindingSource.MoveNext();
                edtConteudoProgramatico.Focus();
            }
        }

        private void btnAdicionarData_Click(object sender, EventArgs e)
        {
            var planoAulaCab = repository.GetByKey(this.IdItem);

            PlanoAulaDetalhe pad = new PlanoAulaDetalhe
            {
                Data = edtData.Value,
                PlanoAulaCab = planoAulaCab,
                Conteudo = edtConteudoProgramatico.Text,
                Referencia = edtReferencia.Text
#warning rever
                //HoraFinal = dtpAte.Value.Hour,
                //HoraInicio = dtpDe.Value.Hour,
                //MinutoInicio = dtpDe.Value.Minute,
                //MinutoFinal = dtpAte.Value.Minute
            };
            repositoryDetalhe.Insert(pad);

            AtualizarDados();
        }

        private void btnExcluirData_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Confirma a exclusão do item selecionado?", "Exclusão", MessageBoxButtons.OKCancel) == DialogResult.OK)
            {
                repositoryDetalhe.Delete(planoAulaDetalheBindingSource.Current.ConvertTo<PlanoAulaDetalhe>().Id);
                AtualizarDados();
            }
        }

        private void toolStripButtonVisualizar_Click(object sender, EventArgs e)
        {   
#warning reativar depois
            //new relPlanoAulaForm(this.IdItem).ExbirFormulario(this);
        }

        private void dgvDados_SelectionChanged(object sender, EventArgs e)
        {
            if (planoAulaDetalheBindingSource.Current != null)
            {
                var id = planoAulaDetalheBindingSource.Current.ConvertTo<PlanoAulaDetalhe>().Id;
                var planoAulaDetalhe = repositoryDetalhe.GetByKey(id);

                if (planoAulaDetalhe != null)
                {
                    edtConteudoProgramatico.Text = planoAulaDetalhe.Conteudo;
                    edtReferencia.Text = planoAulaDetalhe.Referencia;
                    edtData.Value = planoAulaDetalhe.Data;
                    ddlHorario.SelectedItem = planoAulaDetalhe.DiaAula;
                }
            }
        }

        int horaInicio = 0, horaFim = 0, minutoInicio = 0, minutoFim = 0;
        private void dgvDados_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            switch (e.ColumnIndex)
            {
                case 0:
                    {
                        if (e.Value != null)
                            dgvDados.Rows[e.RowIndex].Cells[7].Value = e.Value.ConvertTo<int>().RetornarDiaPorExtenso();
                        break;
                    }
                case 8:
                    {
                        horaInicio = dgvDados.Rows[e.RowIndex].Cells[3].Value.ConvertTo<int>();
                        minutoInicio = dgvDados.Rows[e.RowIndex].Cells[4].Value.ConvertTo<int>();
                        horaFim = dgvDados.Rows[e.RowIndex].Cells[5].Value.ConvertTo<int>();
                        minutoFim = dgvDados.Rows[e.RowIndex].Cells[6].Value.ConvertTo<int>();
                        e.Value = string.Format("{0}:{1}", horaInicio.ToString().PadLeft(2, '0'), minutoInicio.ToString().PadLeft(2, '0'));
                        break;
                    }
                case 9:
                    {
                        e.Value = string.Format("{0}:{1}", horaFim.ToString().PadLeft(2, '0'), minutoFim.ToString().PadLeft(2, '0'));
                        break;
                    }
            }
        }

        private void ddlHorario_Format(object sender, ListControlConvertEventArgs e)
        {
            e.Value = e.ListItem.ConvertTo<DiaAula>().ToString();
        }
    }
}
